package cn.tedu.day01;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/*主启动类注解*/
@SpringBootApplication
public class NacosConcumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConcumerApplication.class);
    }


    /**
     * RestTemplate封装了Http请求方式,我们可以直接通过
     * 此对象远程访问另一个http服务.这个对象在springboot工程启动时并没有初始化,
     * 所以需要我们手动创建一个这样的对象,并将此对象交给spring管理(@Bean)
     *
     * @Bean 应用说明:
     * 1)用于在@Configuration注解描述的类中描述方法
     * 2)此注解描述的方法用于创建一个第三方对象并交给spring管理
     * 3)Spring存储时这个bean时,默认为bean起的名字为方法名
     */
    @Bean
    //@LoadBalanced //注解描述RestTemplate对象时,表示让restTemplate具备了负载均衡的特性
    public RestTemplate restTemplate() {//bean的名字默认为方法名
        return new RestTemplate();
    }


    @Value("${spring.application.name}")
    private String appName;

    @RestController
    public class ConsumerController {
        @Autowired
        private RestTemplate restTemplate;

        /**
         * 此对象可以基于服务名,找到具体的服务实例(ServiceInstance),找到了
         * 实例后就可以获取实例对应的ip地址(host)和端口号,拿到ip
         * 地址和端口号以后就可以通过restTemplate调用对应的服务了
         */
        @Autowired
        private LoadBalancerClient loadBalancerClient;


        @GetMapping("/consumer/doRestEcho")
        public String doRestEcho() {
            //System.out.println("restTemplate="+restTemplate);
            //return "consumer rest echo";
            //服务提供的的url
            //String url="http://localhost:8081/provider/echo/hello";
            //String url="http://nacos-provider/provider/echo/hello";//其中nacos-provider为服务名
            ServiceInstance serviceInstance =//8081,8082
                    loadBalancerClient.choose("nacos-provider");
            String serviceIp = serviceInstance.getHost();//ip
            int servicePort = serviceInstance.getPort();//port
            // String url="http://"+serviceIp+":"+servicePort+"/provider/echo/hello";
            String url = String.format("http://%s:%s/provider/echo/%s", serviceIp, servicePort, appName);
            //向服务提供方法发起请求
            return restTemplate.getForObject(
                    url,//要请求的服务的地址
                    String.class);//String.class为请求服务的响应结果类型(responseType)

        }
    }
}
